package com.scyshkj.university.wechat.pay;

import com.scyshkj.university.wechat.SessionKeys;
import com.scyshkj.university.wechat.utils.*;
import lombok.Data;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.servlet.http.HttpServletRequest;
import javax.xml.bind.annotation.XmlRootElement;
import java.math.BigDecimal;

/**
 * Created by 唐旭 on 2016/11/22.
 */
@Data
@Entity
@Table(name = "Recharge")
@XmlRootElement
public class WechatUnifiedOrderRequestParameter extends Recharge implements ParameterToMap {
    private String appid;// 字段名:公众账号ID; 必填:是; 类型:private String(32); 示例值:wx8888888888888888;
    // 描述:微信分配的公众账号ID
    private String mch_id;// 字段名:商户号; 必填:是; 类型:private String(32); 示例值:1900000109; 描述:微信支付分配的商户号
    private String sub_appid;// 字段名:子商户公众账号ID; 必填:否; 类型:private String(32);
    // 示例值:wx8888888888888888;
    // 描述:微信分配的子商户公众账号ID，如需支付完成后返回sub_openid则此参数必传
    private String sub_mch_id;// 字段名:子商户号; 必填:是; 类型:private String(32); 示例值:1900000109;
    // 描述:微信支付分配的子商户号
    private String device_info;// 字段名:设备号; 必填:否; 类型:private String(32); 示例值:13467007045764;
    // 描述:终端设备号(门店号或收银设备ID)，注意：PC网页或公众号内支付请传"WEB"
    private String nonce_str;// 字段名:随机字符串; 必填:是; 类型:private String(32);
    // 示例值:5K8264ILTKCH16CQ2502SI8ZNMTM67VS;
    // 描述:随机字符串，不长于32位。推荐随机数生成算法
    private String sign;// 字段名:签名; 必填:是; 类型:private String(32);
    // 示例值:C380BEC2BFD727A4B6845133519F3AD6; 描述:签名，详见签名生成算法
    private String sign_type;
    private String body;// 字段名:商品描述; 必填:是; 类型:private String(32); 示例值:Ipad mini  16G  白色;
    // 描述:商品或支付单简要描述
    private String detail;// 字段名:商品详情; 必填:否; 类型:private String(8192); 示例值:Ipad mini  16G  白色;
    // 描述:商品名称明细列表
    private String attach;// 字段名:附加数据; 必填:否; 类型:private String(127); 示例值:说明;
    // 描述:附加数据，在查询API和支付通知中原样返回，该字段主要用于商户携带订单的自定义数据
    @Column(name = "out_trade_no")
    private String out_trade_no;// 字段名:商户订单号; 必填:是; 类型:private String(32);
    // 示例值:1217752501201407033233368018;
    // 描述:商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
    private String fee_type;// 字段名:货币类型; 必填:否; 类型:private String(16); 示例值:CNY;
    // 描述:符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型
    @Column(name = "total_fee")
    private String total_fee;// 字段名:总金额; 必填:是; 类型:Int; 示例值:888; 描述:订单总金额，只能为整数，详见支付金额
    @Column(name = "spbill_create_ip")
    private String spbill_create_ip;// 字段名:终端IP; 必填:是; 类型:private String(16); 示例值:8.8.8.8;
    // 描述:APP和网页支付提交用户端ip，Native支付填调用微信支付API的机器IP。
    private String time_start;// 字段名:交易起始时间; 必填:否; 类型:private String(14); 示例值:20091225091010;
    // 描述:订单生成时间，格式为yyyyMMddHHmmss，如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
    private String time_expire;// 字段名:交易结束时间; 必填:否; 类型:private String(14); 示例值:20091227091010;
    // 描述:订单失效时间，格式为yyyyMMddHHmmss，如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则
    private String goods_tag;// 字段名:商品标记; 必填:否; 类型:private String(32); 示例值:WXG;
    // 描述:商品标记，代金券或立减优惠功能的参数，说明详见代金券或立减优惠
    private String notify_url;// 字段名:通知地址; 必填:是; 类型:private String(256);
    // 示例值:http://www.baidu.com/; 描述:接收微信支付异步通知回调地址
    private String trade_type;// 字段名:交易类型; 必填:是; 类型:private String(16); 示例值:JSAPI;
    // 描述:取值如下：JSAPI，NATIVE，APP，详细说明见参数规定
    private String product_id;// 字段名:商品ID; 必填:否; 类型:private String(32);
    // 示例值:12235413214070356458058;
    // 描述:trade_type=NATIVE，此参数必传。此id为二维码中包含的商品ID，商户自行定义。
    private String openid;// 字段名:用户标识; 必填:否; 类型:private String(128);
    // 示例值:oUpF8uMuAJO_M2pxb1Q9zNjWeS6o;
    // 描述:用户在商户appid下的唯一标识。trade_type=JSAPI时，openid与sub_openid必传其中之一，如选择传递sub_openid,则sub_appid也为必传参数，反之则可以不用传sub_appid。下单前需要调用【网页授权获取用户信息】接口获取到用户的Openid。
    @Column(name = "sub_openid")
    private String sub_openid;// 字段名:用户子标识; 必填:否; 类型:private String(128);
    // 示例值:oUpF8uMuAJO_M2pxb1Q9zNjWeS6o;
    // 描述:用户在商户appid下的唯一标识。trade_type=JSAPI时，openid与sub_openid必传其中之一，如选择传递sub_openid,则sub_appid也为必传参数，反之则可以不用传sub_appid。下单前需要调用【网页授权获取用户信息】接口获取到用户的Openid。

    public WechatUnifiedOrderRequestParameter() {
    }

    public WechatUnifiedOrderRequestParameter(WechatProperties properties, BigDecimal amount, String applyId) {
        this.appid = properties.getAgentAppId();
        this.mch_id = properties.getAgentMchId();
        this.sub_appid = properties.getAppid();
        this.sub_mch_id = properties.getMchId();
        this.device_info = "WEB";
        this.nonce_str = RandomStringUtil.getRandomString(32);
        this.sign_type = "MD5";
        this.body = "成都大学-一卡通充值";
        this.detail = "";
        this.out_trade_no = UuidGenerator.generate();
        BigDecimal multiply = amount.multiply(new BigDecimal("10"));
        this.total_fee = multiply.toString();
        HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        this.spbill_create_ip = ServerAddressUtil.getServerAddress(req);
        this.trade_type = "JSAPI";
        this.attach = applyId;
        this.notify_url = properties.getNotifyUrl();
        WechatAccessToken accessToken = (WechatAccessToken) SessionUtils.getAttribute(SessionKeys.WECHAT_ACCESS_TOKEN);
        this.sub_openid = accessToken.getOpenid();
    }


}
